package br.com.devmedia.controller.managedbeans;

import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;

import org.apache.commons.io.IOUtils;
import org.primefaces.event.FileUploadEvent;
import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;

import br.com.devmedia.beans.Funcionario;
import br.com.devmedia.conversores.ConverterGrupo;
import br.com.devmedia.conversores.ConverterSetor;
import br.com.devmedia.modelo.dao.HibernateDAO;
import br.com.devmedia.modelo.dao.InterfaceDAO;
import br.com.devmedia.util.UtilErros;
import br.com.devmedia.util.UtilMensagens;

@ManagedBean
@SessionScoped
public class FuncionarioBean {
	private InterfaceDAO<Funcionario> funcionarioDAO;

	private ConverterGrupo converterGrupo;
	private ConverterSetor converterSetor;

	private Funcionario funcionario;

	public FuncionarioBean() {
		funcionarioDAO = new HibernateDAO<Funcionario>(Funcionario.class);

		converterGrupo = new ConverterGrupo();
		converterSetor = new ConverterSetor();
	}

	public String listar() {
		return "/privado/funcionario/listar?faces-redirect=true";
	}

	public String novo() {
		funcionario = new Funcionario();
		return "form?faces-redirect=true";
	}

	public String cancelar() {
		return "listar?faces-redirect=true";
	}

	public String gravar() {
		if (funcionario.getId() == null) {
			funcionarioDAO.gravar(funcionario);
		} else
			funcionarioDAO.atualizar(funcionario);
		
		return "listar?faces-redirect=true";
	}

	public String alterar(Funcionario func) {
		this.funcionario = func;
		return "form?faces-redirect=true";
	}

	public String excluir(Funcionario func) {
		this.funcionarioDAO.excluir(func);
		return "listar?faces-redirect=true";
	}

	public List<Funcionario> listarTodos() {
		return this.funcionarioDAO.listarTodos();
	}

	public void enviarFoto(FileUploadEvent event) {
		try {
			byte[] foto = IOUtils.toByteArray(event.getFile().getInputstream());
			funcionario.setFoto(foto);
			UtilMensagens.mensagemInformacao("Arquivo " + event.getFile().getFileName() + " enviado com sucesso.");
		} catch (Exception e) {
			UtilMensagens.mensagemErro("Erro ao enviar arquivo: " + UtilErros.getMensagemErro(e));
		}
	}

	public StreamedContent getImagemDinamica() {
		String id_imagem = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("id_imagem");

		if (id_imagem != null) {
			Integer id = Integer.parseInt(id_imagem);
			Funcionario busca = funcionarioDAO.busca(id);
			
			return busca.getImagem();
		}
		
		return new DefaultStreamedContent();
	}

	public InterfaceDAO<Funcionario> getFuncionarioDAO() {
		return funcionarioDAO;
	}

	public void setFuncionarioDAO(InterfaceDAO<Funcionario> funcionarioDAO) {
		this.funcionarioDAO = funcionarioDAO;
	}

	public ConverterGrupo getConverterGrupo() {
		return converterGrupo;
	}

	public void setConverterGrupo(ConverterGrupo converterGrupo) {
		this.converterGrupo = converterGrupo;
	}

	public ConverterSetor getConverterSetor() {
		return converterSetor;
	}

	public void setConverterSetor(ConverterSetor converterSetor) {
		this.converterSetor = converterSetor;
	}

	public Funcionario getFuncionario() {
		return funcionario;
	}

	public void setFuncionario(Funcionario funcionario) {
		this.funcionario = funcionario;
	}
}
